﻿using Microsoft.VisualStudio.TestTools.UnitTesting;

using AM.Json;
using AM.Runtime;
using AM.Xml;

using ManagedIrbis;
using ManagedIrbis.Magazines;

// ReSharper disable CheckNamespace
// ReSharper disable ForCanBeConvertedToForeach
// ReSharper disable IdentifierTypo
// ReSharper disable InvokeAsExtensionMethod
// ReSharper disable StringLiteralTypo

#nullable enable

namespace UnitTests.ManagedIrbis.Magazines
{
    [TestClass]
    public class MagazineCumulationTest
        : Common.CommonUnitTest
    {
        private static Field Parse(int tag, string text)
        {
            var result = new Field { Tag = tag };
            result.DecodeBody(text);

            return result;
        }

        private Field _GetField()
        {
            return Parse(MagazineCumulation.Tag, "1,3,4,6,7,9,10,12,13,15,16,18,20,21,23,25,26,28,29,31,32,34,35,37,38,40,41,43,44,46,48,49,51,52,54,55,57,58,60,61,64,66,67,69,70,72,73,75,76,78,79,81,82,84,85,87,88,90,91,93,94,96,97,99,100,102,103,105,106,108,109,111,114,115,2/ч,5/ч,8/ч,11/ч,14/ч,17/ч,19/ч,22/ч,24/ч,27/ч,30/ч,33/ч,36/ч,39/ч,42/ч,45/ч,47/ч,50/ч,53/ч,56/ч,59/ч,62/ч,65/ч,68/ч,71/ч,74/ч,77/ч,80/ч,83/ч,86/ч,89/ч,92/ч,95/ч,98/ч,101/ч,104/ч,107/ч,4/п,7/п,10/п,13/п,16/п,21/п,26/п,29/п,32/п,35/п,38/п,41/п,44/п,52/п,55/п,58/п,61/п,67/п,70/п,72/п,73/п,79/п,82/п,85/п,88/п,91/п,94/п,97/п,100/п,103/п,106/п,109/п,63/д,110/ч,112/п,113/ч,115/п,117,118,120,121,123,124,116/ч,118/п,119/ч,121/п,122/ч,124/п,126,128,129,131,127/ч,129/п,130/ч,132/п,132,134,135,137,138,135/п,138/п,133/ч,136/ч,139/ч,140,141/п,141,142/ч,145/ч,143,144/п,144,146,147,147/п,148/ч,149,125/ч-126,1/т-52/т");
        }

        private MagazineCumulation _GetCumulation()
        {
            var result = new MagazineCumulation
            {
                Year = "2016",
                Place = "Ф403",
                Numbers = "1,3,4,6,7,9,10,12,13,15,16,18,20,21,23,25,26,28,29,31,32,34,35,37,38,40,41,43,44,46,48,49,51,52,54,55,57,58,60,61,64,66,67,69,70,72,73,75,76,78,79,81,82,84,85,87,88,90,91,93,94,96,97,99,100,102,103,105,106,108,109,111,114,115,2/ч,5/ч,8/ч,11/ч,14/ч,17/ч,19/ч,22/ч,24/ч,27/ч,30/ч,33/ч,36/ч,39/ч,42/ч,45/ч,47/ч,50/ч,53/ч,56/ч,59/ч,62/ч,65/ч,68/ч,71/ч,74/ч,77/ч,80/ч,83/ч,86/ч,89/ч,92/ч,95/ч,98/ч,101/ч,104/ч,107/ч,4/п,7/п,10/п,13/п,16/п,21/п,26/п,29/п,32/п,35/п,38/п,41/п,44/п,52/п,55/п,58/п,61/п,67/п,70/п,72/п,73/п,79/п,82/п,85/п,88/п,91/п,94/п,97/п,100/п,103/п,106/п,109/п,63/д,110/ч,112/п,113/ч,115/п,117,118,120,121,123,124,116/ч,118/п,119/ч,121/п,122/ч,124/п,126,128,129,131,127/ч,129/п,130/ч,132/п,132,134,135,137,138,135/п,138/п,133/ч,136/ч,139/ч,140,141/п,141,142/ч,145/ч,143,144/п,144,146,147,147/п,148/ч,149,125/ч-126,1/т-52/т",
                ComplectNumber = "1"
            };

            return result;
        }

        private Record _GetRecord()
        {
            var result = new Record();
            result.Fields.Add(Parse(101, "rus"));
            result.Fields.Add(Parse(102, "RU"));
            result.Fields.Add(Parse(300, "С регион. вклад. КП-Байкал"));
            result.Fields.Add(Parse(903, "К632"));
            result.Fields.Add(Parse(990, "0"));
            result.Fields.Add(Parse(110, "^Ta^Bc^D260^X260^Ea"));
            result.Fields.Add(Parse(210, "^CООО \"Агентство \"КП-Байкал\"^AИркутск^ 9№"));
            result.Fields.Add(Parse(920, "J"));
            result.Fields.Add(Parse(938, "^Q2014/0^A1"));
            result.Fields.Add(Parse(938, "^Q2015/0^A1"));
            result.Fields.Add(Parse(934, "2017"));
            result.Fields.Add(Parse(938, "^Q2016/0^A1"));
            result.Fields.Add(Parse(200, "^AКомсомольская правда^LКомс. правда"));
            result.Fields.Add(Parse(60, "15"));
            result.Fields.Add(Parse(901, "^Q2014^A2^B1^DФ403^FМОЭ^KФ403 - экз.1"));
            result.Fields.Add(Parse(901, "^Q2014^A2^B2^DФ303^FМОЭ^KФ303 - экз.2"));
            result.Fields.Add(Parse(901, "^Q2014^A2^B3^DФ303^FМОЭ^KФ303 - экз.3"));
            result.Fields.Add(Parse(901, "^Q2015^A2^B1^DФ403^FМОЭ^KФ403 - экз.1"));
            result.Fields.Add(Parse(901, "^Q2015^A2^B2^DФ304^FМОЭ^KФ304 - экз.2"));
            result.Fields.Add(Parse(901, "^Q2015^A2^B3^DФ304^FМОЭ^KФ304 - экз.3"));
            result.Fields.Add(Parse(901, "^Q2016^A0^B1^DФ403^FМОЭ^KФ403 - экз.1"));
            result.Fields.Add(Parse(901, "^Q2016^A0^B2^DФ304^FМОЭ^KФ304 - экз.2"));
            result.Fields.Add(Parse(901, "^Q2016^A0^B3^DФ304^FМОЭ^KФ304 - экз.3"));
            result.Fields.Add(Parse(901, "^Q2017^A0^B1^DФ403^FМОЭ^KФ403 - экз.1"));
            result.Fields.Add(Parse(901, "^Q2017^A0^B2^DФ304^FМОЭ^KФ304 - экз.2"));
            result.Fields.Add(Parse(901, "^Q2017^A0^B3^DФ304^FМОЭ^KФ304 - экз.3"));
            result.Fields.Add(Parse(423, "^AМоя любимая область^12012/27 сент.(39/т),2013/27 дек.(52/т), 2017/26 июля (30/т)"));
            result.Fields.Add(Parse(423, "^AМоя Иркутская область^Eрегиональный выпуск^FКП-Байкал^HМ263370996^12017/27 сент.(39/т)"));
            result.Fields.Add(Parse(910, "^A0^B1^FМОЭ^DФ403^G2017"));
            result.Fields.Add(Parse(910, "^A0^B2^FМОЭ^DФ304^G2017"));
            result.Fields.Add(Parse(910, "^A0^B3^FМОЭ^DФ304^G2017"));
            result.Fields.Add(Parse(909, "^Q2017^DФ403^H1,3,4,6,7,9,10,12-129,2/ч,5/ч,8/ч,11/ч,4/п,7/п,10/п,13/п,16/п,19/п,24/п,26/п,29/п,32/п,35/п,38/п,41/п,44/п,52/п,55/п,58/п,61/п,67/п,70/п,73/п,76/п,79/п,81/п,85/п,88/п,91/п,94/п,97/п,100/п,103/п,106/п,109/п,112/п,115/п,118/п,121/п,124/п,1/т-45/т^k1"));
            result.Fields.Add(Parse(909, "^Q2017^DФ304^H1,3,4,6,7,9,10,12-84,86-129,2/ч,5/ч,8/ч,11/ч,4/п,7/п,10/п,13/п,16/п,19/п,24/п,26/п,29/п,32/п,35/п,38/п,41/п,44/п,52/п,55/п,58/п,67/п,70/п,73/п,76/п,79/п,81/п,85/п,88/п,91/п,94/п,97/п,100/п,103/п,106/п,109/п,112/п,115/п,118/п,121/п,124/п,61 п,1/т-22/т,26/т-45/т,23-25 т^k3"));
            result.Fields.Add(Parse(909, "^Q2017^DФ304^H1,3,4,6,7,9,10,12-84,86-129,2/ч,5/ч,8/ч,11/ч,4/п,7/п,10/п,13/п,16/п,19/п,24/п,26/п,29/п,32/п,35/п,38/п,41/п,44/п,52/п,55/п,58/п,67/п,70/п,73/п,76/п,79/п,81/п,85/п,88/п,91/п,94/п,97/п,100/п,103/п,106/п,109/п,112/п,115/п,118/п,121/п,124/п,61 п,1/т-22/т,26/т-45/т,23-25 т^k2"));
            result.Fields.Add(Parse(909, "^q2016^dФП^k3^HПодшивка № 5384 февр. (5-21)"));
            result.Fields.Add(Parse(909, "^Q2016^DФ403^H1,3,4,6,7,9,10,12,13,15,16,18,20,21,23,25,26,28,29,31,32,34,35,37,38,40,41,43,44,46,48,49,51,52,54,55,57,58,60,61,64,66,67,69,70,72,73,75,76,78,79,81,82,84,85,87,88,90,91,93,94,96,97,99,100,102,103,105,106,108,109,111,114,115,2/ч,5/ч,8/ч,11/ч,14/ч,17/ч,19/ч,22/ч,24/ч,27/ч,30/ч,33/ч,36/ч,39/ч,42/ч,45/ч,47/ч,50/ч,53/ч,56/ч,59/ч,62/ч,65/ч,68/ч,71/ч,74/ч,77/ч,80/ч,83/ч,86/ч,89/ч,92/ч,95/ч,98/ч,101/ч,104/ч,107/ч,4/п,7/п,10/п,13/п,16/п,21/п,26/п,29/п,32/п,35/п,38/п,41/п,44/п,52/п,55/п,58/п,61/п,67/п,70/п,72/п,73/п,79/п,82/п,85/п,88/п,91/п,94/п,97/п,100/п,103/п,106/п,109/п,63/д,110/ч,112/п,113/ч,115/п,117,118,120,121,123,124,116/ч,118/п,119/ч,121/п,122/ч,124/п,126,128,129,131,127/ч,129/п,130/ч,132/п,132,134,135,137,138,135/п,138/п,133/ч,136/ч,139/ч,140,141/п,141,142/ч,145/ч,143,144/п,144,146,147,147/п,148/ч,149,125/ч-126,1/т-52/т^k1"));
            result.Fields.Add(Parse(909, "^Q2016^DФ304^H1,3,4,6,7,9,10,12,13,15,16,18,20,21,23,25,26,28,29,31,32,34,35,37,38,40,41,43,44,46,48,49,51,52,54,55,57,58,60,61,64,66,67,69,70,72,73,75,76,78,79,81,82,84,85,87,88,90,91,93,94,96,97,99,100,102,103,105,106,108,109,111,114,115,2/ч,5/ч,8/ч,11/ч,14/ч,17/ч,19/ч,22/ч,24/ч,27/ч,30/ч,33/ч,36/ч,39/ч,42/ч,45/ч,47/ч,50/ч,53/ч,56/ч,59/ч,62/ч,65/ч,68/ч,71/ч,74/ч,77/ч,80/ч,83/ч,86/ч,89/ч,92/ч,95/ч,98/ч,101/ч,104/ч,107/ч,4/п,7/п,10/п,13/п,16/п,21/п,26/п,29/п,32/п,35/п,38/п,41/п,44/п,52/п,55/п,58/п,61/п,67/п,70/п,72/п,73/п,79/п,82/п,85/п,88/п,91/п,94/п,97/п,100/п,103/п,106/п,109/п,63/д,110/ч,112/п,113/ч,115/п,117,118,120,121,123,124,116/ч,118/п,119/ч,121/п,122/ч,124/п,126,128,129,131,127/ч,129/п,130/ч,132/п,132,134,135,137,138,135/п,138/п,133/ч,136/ч,139/ч,140,141/п,141,142/ч,145/ч,143,144/п,144,146,147,147/п,148/ч,149,125/ч-126,1/т-52/т^k3"));
            result.Fields.Add(Parse(909, "^Q2016^DФ304^H1,3,4,6,7,9,10,12,13,15,16,18,20,21,23,25,26,28,29,31,32,34,35,37,38,40,41,43,44,46,48,49,51,52,54,55,57,58,60,61,64,66,67,69,70,72,73,75,76,78,79,81,82,84,85,87,88,90,91,93,94,96,97,99,100,102,103,105,106,108,109,111,114,115,2/ч,5/ч,8/ч,11/ч,14/ч,17/ч,19/ч,22/ч,24/ч,27/ч,30/ч,33/ч,36/ч,39/ч,42/ч,45/ч,47/ч,50/ч,53/ч,56/ч,59/ч,62/ч,65/ч,68/ч,71/ч,74/ч,77/ч,80/ч,83/ч,86/ч,89/ч,92/ч,95/ч,98/ч,101/ч,104/ч,107/ч,4/п,7/п,10/п,13/п,16/п,21/п,26/п,29/п,32/п,35/п,38/п,41/п,44/п,52/п,55/п,58/п,61/п,67/п,70/п,72/п,73/п,79/п,82/п,85/п,88/п,91/п,94/п,97/п,100/п,103/п,106/п,109/п,63/д,110/ч,112/п,113/ч,115/п,117,118,120,121,123,124,116/ч,118/п,119/ч,121/п,122/ч,124/п,126,128,129,131,127/ч,129/п,130/ч,132/п,132,134,135,137,138,135/п,138/п,133/ч,136/ч,139/ч,140,141/п,141,142/ч,145/ч,143,144/п,144,146,147,147/п,148/ч,149,125/ч-126,1/т-52/т,Подшивка № 4821 апр. (34-46),Подшивка № 4821 апр. (34-46),Подшивка № 4822 авг. (85-97),Подшивка № 4823 нояб. (124-135),Подшивка № 4824 май (47-58),Подшивка № 4825 март (21-33),Подшивка № 4826 июнь (59-71),Подшивка № 4827 сент. (98-111),Подшивка № 4828 февр. (10-21),Подшивка № 4831 янв.-дек. (136-149),Подшивка № 4883 окт. (112-124),Подшивка № 4884 янв. (1-9),Подшивка № 4885 июль (72-84)^k2"));
            result.Fields.Add(Parse(909, "^q2015^dФП^k3^HПодшивка № 5169 дек. (136-149),Подшивка № 5376 сент. (40-98),Подшивка № 5377 авг. (32-97),Подшивка № 5378 апр. (14-47),Подшивка № 5381 июнь (23-71),Подшивка № 5382 нояб. (45-136),Подшивка № 5383 март (10-24),Подшивка № 5384 февр. (6-21),Подшивка № 5385 май-июнь (19-59),Подшивка № 5729 июль (27-0),Подшивка № 5730 окт. (39-124),Подшивка № 5731 янв. (1-9)"));
            result.Fields.Add(Parse(909, "^Q2015^DФ403^H1,3,4,6,7,9,10,12,13,15,16,18,19,21,22,24,25,27,28,30,31,33,34,36,37,39,40,42,43,45,46,48,50,51,53,54,56,57,59,60,62,63,65,67,68,70,71,73,74,76,77,80,82,83,86,88,89,91,92,94,95,97,98,100,101,103,104,106,107,109,110,112,113,115,116,118,119,121,122,124-127,129,130,132,133,135,136,138,139,141,142,144,145,147-149,2/ч,5/ч,8/ч,11/ч,14/ч,17/ч,20/ч,23/ч,26/ч,29/ч,32/ч,35/ч,38/ч,41/ч,44/ч,47/ч,49/ч,52/ч,55/ч,58/ч,61/ч,64/ч,66/ч,69/ч,72/ч,75/ч,78/ч,81/ч,84/ч,87/ч,90/ч,93/ч,96/ч,99/ч,102/ч,105/ч,108/ч,111/ч,114/ч,117/ч,120/ч,123/ч,128/ч,131/ч,134/ч,137/ч,140/ч,143/ч,146/ч,4/п,7/п,10/п,13/п,16/п,22/п,28/п,31/п,34/п,37/п,40/п,43/п,46/п,53/п,57/п,60/п,63/п,68/п,71/п,74/п,77/п,83/п,86/п,89/п,92/п,95/п,98/п,101/п,104/п,107/п,110/п,113/п,116/п,119/п,122/п,125/п,127/п,130/п,133/п,136/п,139/п,142/п,145/п,148/п,29/с,спецвыпуск,спец. вып. \"Иркутские сороковые: военные и трудовые\",79/80-с,85/86-с,1/т-53/т^k1"));
            result.Fields.Add(Parse(909, "^Q2015^DФ304^H1,3,4,6,7,9,10,12,13,15,16,18,19,21,22,24,25,27,28,30,31,33,34,36,37,39,40,42,43,45,46,48,50,51,53,54,56,57,59,60,62,63,65,67,68,70,71,73,74,76,77,80,82,83,86,88,89,91,92,94,95,97,98,100,101,103,104,106,107,109,110,112,113,115,116,118,119,121,122,124-127,129,130,132,133,135,136,138,139,141,142,144,145,147-149,2/ч,5/ч,8/ч,11/ч,14/ч,17/ч,20/ч,23/ч,26/ч,29/ч,32/ч,35/ч,38/ч,41/ч,44/ч,47/ч,49/ч,52/ч,55/ч,58/ч,61/ч,64/ч,66/ч,69/ч,72/ч,75/ч,78/ч,81/ч,84/ч,87/ч,90/ч,93/ч,96/ч,99/ч,102/ч,105/ч,108/ч,111/ч,114/ч,117/ч,120/ч,123/ч,128/ч,131/ч,134/ч,137/ч,140/ч,143/ч,146/ч,4/п,7/п,10/п,13/п,16/п,22/п,28/п,31/п,34/п,37/п,40/п,43/п,46/п,53/п,57/п,60/п,63/п,68/п,71/п,74/п,77/п,83/п,86/п,89/п,92/п,95/п,98/п,101/п,104/п,107/п,110/п,113/п,116/п,119/п,122/п,125/п,127/п,130/п,133/п,136/п,139/п,142/п,145/п,148/п,29/с,спецвыпуск,спец. вып. \"Иркутские сороковые: военные и трудовые\",79/80-с,85/86-с,1/т-53/т^k3"));
            result.Fields.Add(Parse(909, "^Q2015^DФ304^H1,3,4,6,7,9,10,12,13,15,16,18,19,21,22,24,25,27,28,30,31,33,34,36,37,39,40,42,43,45,46,48,50,51,53,54,56,57,59,60,62,63,65,67,68,70,71,73,74,76,77,80,82,83,86,88,89,91,92,94,95,97,98,100,101,103,104,106,107,109,110,112,113,115,116,118,119,121,122,124-127,129,130,132,133,135,136,138,139,141,142,144,145,147-149,2/ч,5/ч,8/ч,11/ч,14/ч,17/ч,20/ч,23/ч,26/ч,29/ч,32/ч,35/ч,38/ч,41/ч,44/ч,47/ч,49/ч,52/ч,55/ч,58/ч,61/ч,64/ч,66/ч,69/ч,72/ч,75/ч,78/ч,81/ч,84/ч,87/ч,90/ч,93/ч,96/ч,99/ч,102/ч,105/ч,108/ч,111/ч,114/ч,117/ч,120/ч,123/ч,128/ч,131/ч,134/ч,137/ч,140/ч,143/ч,146/ч,4/п,7/п,10/п,13/п,16/п,22/п,28/п,31/п,34/п,37/п,40/п,43/п,46/п,53/п,57/п,60/п,63/п,68/п,71/п,74/п,77/п,83/п,86/п,89/п,92/п,95/п,98/п,101/п,104/п,107/п,110/п,113/п,116/п,119/п,122/п,125/п,127/п,130/п,133/п,136/п,139/п,142/п,145/п,148/п,29/с,спецвыпуск,спец. вып. \"Иркутские сороковые: военные и трудовые\",79/80-с,85/86-с,1/т-53/т,Подшивка № 4446 авг. (86-98),Подшивка № 4447 окт. (111-124),Подшивка № 4448 нояб. (125-136),Подшивка № 4449 сент. (98-110),Подшивка № 4450 март (22-34),Подшивка № 4451 янв.-дек. (136-149),Подшивка № 4452 янв. (1-9),Подшивка № 4453 февр. (10-21),Подшивка № 4454 апр. (35-47),Подшивка № 4455 май (48-59),Подшивка № 4456 май (22,57),Подшивка № 4457 июнь (60-71),Подшивка № 4458 июль (72-85)^k2"));
            result.Fields.Add(Parse(909, "^q2014^dФП^k3^HПодшивка № 5232 янв.-март (1-35),Подшивка № 5233 окт.-дек. (40-148),Подшивка № 5239 апр.-июнь (35-71),Подшивка № 5393 июль-сент. (28-0)"));
            result.Fields.Add(Parse(909, "^Q2014^DФ403^H1-78,80-84,86-104,106,107,109-113,115,116,118,119,121-127,129,130,132,133,135,136,138,139,141,142,144,145,147,148,2/п,5/п,8/п,11/п,14/п,17/п,20/п,23/п,29/п,32/п,35/п,38/п,41/п,44/п,47/п,54/п,57/п,60/п,63/п,68/п,71/п,74/п,77/п,80/п,83/п,86/п,89/п,92/п,95/п,98/п,101/п,104/п,107/п,110/п,113/п,116/п,119/п,122/п,127/п,130/п,133/п,136/п,139/п,142/п,145/п,148/п,105/ч,108/ч,114/ч,117/ч,120/ч,128/ч,131/ч,134/ч,137/ч,140/ч,143/ч,146/ч,79/80-с,85/86-с,1/т-52/т^k1"));
            result.Fields.Add(Parse(909, "^Q2014^DФ304^H1-78,80-84,86-104,106,107,109-113,115,116,118,119,121-127,129,130,132,133,135,136,138,139,141,142,144,145,147,148,2/п,5/п,8/п,11/п,14/п,17/п,20/п,23/п,29/п,32/п,35/п,38/п,41/п,44/п,47/п,54/п,57/п,60/п,63/п,68/п,71/п,74/п,77/п,80/п,83/п,86/п,89/п,92/п,95/п,98/п,101/п,104/п,107/п,110/п,113/п,116/п,119/п,122/п,127/п,130/п,133/п,136/п,139/п,142/п,145/п,148/п,105/ч,108/ч,114/ч,117/ч,120/ч,128/ч,131/ч,134/ч,137/ч,140/ч,143/ч,146/ч,79/80-с,85/86-с,1/т-52/т, Подшивка № 2861 июнь (60п-71п), Подшивка № 2862 авг. (85-97), Подшивка № 2873 сент. (98/п-110), Подшивка № 2872 нояб. (45/т-135),Подшивка № 4020 окт. (40-124),Подшивка № 4021 дек. (49-148),Подшивка № 4022 февр. (11-22),Подшивка № 4023 апр. (35-48),Подшивка № 4024 июль (71-31),Подшивка № 4025 июнь (18-59),Подшивка № 4026 янв. (1-10),Подшивка № 4058 март (24-35)^k2"));
            result.Fields.Add(Parse(909, "^Q2014^DФ304^H1-78,80-83,86-104,106,107,109-113,115,116,118,119,121-127,129,130,132,133,135,136,138,139,141,142,144,145,147,148,2/п,5/п,8/п,11/п,14/п,17/п,20/п,23/п,29/п,32/п,35/п,38/п,41/п,44/п,47/п,54/п,57/п,60/п,63/п,68/п,71/п,74/п,77/п,80/п,83/п,86/п,89/п,92/п,95/п,98/п,101/п,104/п,107/п,110/п,113/п,116/п,119/п,122/п,127/п,130/п,133/п,136/п,139/п,142/п,145/п,148/п,105/ч,108/ч,114/ч,117/ч,120/ч,128/ч,131/ч,134/ч,137/ч,140/ч,143/ч,146/ч,79/80-с,85/86-с,1/т-52/т^k3"));
            result.Fields.Add(Parse(909, "^Q2013^DФП^HПодшивка № 3817 сент.-окт. (111-144)^k5"));
            result.Fields.Add(Parse(909, "^Q2013^DФП^HПодшивка № 3807 нояб.-дек. (143-168),Подшивка № 3813 май-июнь (62-90),Подшивка № 3823 янв.-февр. (1-28)^k4"));
            result.Fields.Add(Parse(909, "^Q2013^DФП^HПодшивка № 3806 март-апр. (29-61),Подшивка № 3859 июль-авг. (27-116)^k3"));
            result.Fields.Add(Parse(909, "^Q2013^DФ304^H1-167,90с,2д,6д,10д,14д,18д,22д,26д,29д,33д,35д,39д,43д,47д,51д,55д,59д,66д,70д,74д,78д,81д,85д,89д,102д,105д,  Подшивка № 2463 янв. (1/т-14д), Подшивка № 2464 фев. (14-29д), Подшивка № 2465 март (29-44), Подшивка № 2466 апр. (44п-61), Подшивка № 2467 май (18/т-74), Подшивка № 2468 июнь (75-90с), Подшивка № 2469 июль (90п-103), Подшивка № 2470 авг. (31/т-116), Подшивка № 2471 сен. (111п-129п), Подшивка № 2472 окт. (129-44/т), Подшивка № 2473 ноя. (143-155), Подшивка № 2474 дек. (156п-168п),1/т-52/т"));
            result.Fields.Add(Parse(909, "^Q2012^DФП^HПодшивка № 3225 апр.-июнь (47-95),Подшивка № 3969 июль-сент. (96-145),Подшивка № 3971 окт.-дек. (146-197),Подшивка № 3972 янв.-март (1-46)^k3"));
            result.Fields.Add(Parse(909, "^Q2012^DФ304^H1-34,36-195, Подшивка № 2007 янв. (1-13), Подшивка № 2006 февр. (14-30), Подшивка № 2005 март (31д-47), Подшивка № 1893 апр. (47п-63), Подшивка № 2008 май (64-79д), Подшивка № 1894 июнь (79-95), Подшивка № 2009 июль (95п-111), Подшивка № 2010 авг. (112-128), Подшивка № 2011 сент. (129-145), Подшивка № 2012 окт. (145п-163), Подшивка № 2013 нояб. (164д-180), Подшивка № 2014 дек. (181-197)3д,7д,11д,15д,19д,23д,31д,35д,38д,42д,46д,50д,54д,58д,62д,65д,67д,71д,75д,79д,83д,86д,90д,94д,98д,102д,105д,109д,113д,116д,120д,124д,128д,132д,136д,140д,145д,148д,152д,156д,160д,164д,168д,172д,176д,180д,184д,188д,192д,196д,196/197,спец. вып. \"Подарки\",1/т-52/т"));
            result.Fields.Add(Parse(909, "^Q2011^H1-105,108,109,112-116,119-191,194-196,3д,7д,11д,15д,19д,23д,26д,36д,40д,44д,48д,52д,56д,60д,64д,67д,71д,75д,79д,83д,87д,91д,95д,99д,102д,106д,110д,114д,117д,121д,125д,129д,133д,137д,141д,145д,149д,153д,157д,161д,165д,168д,172д,176д,180д,184д,188д,192д,196д,106/107,110/111,117/118,192/193,спец. вып. \"Подарки\",прил. \"Люди дела\",1/т-52/т,30д-32д"));
            result.Fields.Add(Parse(909, "^Q2011^DФП^HПодшивка № 3332 янв.-март (1-44),Подшивка № 3970 июль-сент. (95-145)^k4"));
            result.Fields.Add(Parse(909, "^Q2011^DФП^HПодшивка № 3224 март-июнь (44-95),Подшивка № 3559 нояб. (163-179),Подшивка № 3560 окт. (146-162)^k3"));
            result.Fields.Add(Parse(909, "^Q2011^DФП^HПодшивка № 3092 окт.-дек. (146-196),Подшивка № 3221 янв.-дек. (44-61),Подшивка № 3561 июнь (78-94),Подшивка № 3562 янв. (1-12),Подшивка № 3569 май (62-77),Подшивка № 3589 авг. (112-128),Подшивка № 3590 сент. (129-145)^k2"));
            result.Fields.Add(Parse(909, "^Q2011^DФП^H95-111, Подшивка № 2415 июл. (95-111)"));
            result.Fields.Add(Parse(909, "^Q2011^DФП^H28-44, Подшивка № 2426 мар. (28-44)"));
            result.Fields.Add(Parse(909, "^Q2011^DФП^H180-196, Подшивка № 2428 дек. (180-196)"));
            result.Fields.Add(Parse(909, "^Q2011^DФП^H13-27, Подшивка № 2425 февр. (13-27)"));
            result.Fields.Add(Parse(909, "^Q2010^H1-101,104,105,108,109,112,113,116-160,162-192,194,195,3д,7д,11д,15д,19д,23д,26д,30д,33д,37д,41д,45д,49д,53д,57д,61д,64д,68д,72д,76д,80д,84д,87д,91д,95д,99д,102д,106д,110д,114д,118д,122д,126д,130д,134д,138д,142д,146д,150д,154д,158д,162д,168д,172д,176д,180д,188д,192д,196д,102/103,106/107,110/111,114/115,184/д,спец. вып,1/т-52/т"));
            result.Fields.Add(Parse(909, "^Q2010^DФП^HПодшивка № 3964 янв.-дек. (1-196)^k4"));
            result.Fields.Add(Parse(909, "^Q2010^DФП^HПодшивка № 3963 сент.-дек. (146-0)^k3"));
            result.Fields.Add(Parse(909, "^Q2010^DФП^HПодшивка № 3216 янв.-март (1-44),Подшивка № 3331 июль-сент. (95-146),Подшивка № 3942 апр.-июнь (45-94)^k2"));
            result.Fields.Add(Parse(909, "^Q2009^H1-59,61-63,65-85,87-197,1/т,2/т,4/т,8/т,12/т,16/т,20/т,24/т,28/т,32/т,36/т,40/т,44/т,48/т,52/т,56/т,60/т,64/т,67/т,70/т,74/т,78/т,82/т,86/т,89/т,93/т,97/т,101/т,104/т,108/т,112/т,116/т,119/т,123/т,127/т,131/т,135/т,139/т,143/т,147/т,151/т,155/т,159/т,163/т,166/т,170/т,174/т,178/т,182/т,186/т,190/т,194/т,198/т,155/д,170/д,174/д,182/д,159д,163д,166д,178д,186д,190д,194д,167П,спец. вып"));
            result.Fields.Add(Parse(909, "^Q2009^DФП^HПодшивка № 3077 дек. (180-198),Подшивка № 3100 июнь (79-95),Подшивка № 3208 янв. (1-12),Подшивка № 5003 июль (96-112),Подшивка № 5004 авг. (112-128),Подшивка № 5005 сент. (129-145)^k3"));
            result.Fields.Add(Parse(909, "^Q2009^DФП^HПодшивка № 3025 окт. (147-164),Подшивка № 3047 апр. (44-64),Подшивка № 3206 янв.-февр. (13-28),Подшивка № 3655 нояб. (164-179)^k2"));
            result.Fields.Add(Parse(909, "^Q2008^H1-64,66,67,70-104,106-196,2/т,6/т,10/т,14/т,18/т,22/т,26/т,29/т,33/т,36/т,40/т,44/т,48/т,52/т,56/т,60/т,64/т,68/т,71/т,75/т,79/т,83/т,86/т,89/т,93/т,97/т,108/т,112/т,116/т,119/т,123/т,127/т,131/т,135/т,139/т,143/т,147/т,151/т,155/т,159/т,163/т,166/т,170/т,174/т,178/т,182/т,186/т,190/т,194/т,37б,41б,45б,49б,53б,57б,61б,65б,69б,72б,80б,84б,87б,90б,94б,98б,101б,109б,113б,116б,120б,124б,128б,132б,136б,140б,144б,148б,156б,160б,167б,171б,175б,179б,183б,76/б,с/в,101-т, Подшивка № 1589 янв. (1-13), Подшивка № 1590 февр. (14-29), Подшивка № 1591 март (30-45), Подшивка № 1592 апр. (46-63), Подшивка № 1593 май (64-80), Подшивка № 1594 июнь (80-94), Подшивка № 1595 июль (95-111), Подшивка № 1596 авг. (112-128) , Подшивка № 1597 сент. (129-145), Подшивка № 1598 окт.-нояб. (146-163), Подшивка № 1599 нояб.-дек. (164-179), Подшивка № 1600 дек. (180-194)"));
            result.Fields.Add(Parse(909, "^Q2007^DФП^H1-108,110-146,148-194,1/т,3/т,7/т,11/т,19/т,23/т,27/т,30/т,41/т,45/т,49/т,53/т,61/т,63/т,66/т,70/т,82/т,84/т,88/т,92/т,96/т,100/т,104/т,108/т,111/т,115/т,118/т,122/т,126/т,130/т,134/т,138/т,142/т,146/т,150/т,154/т,162/т,165/т,169/т,173/т,177/т,181/т,185/т,189/т,193/т,15т,34т,37т,57т,74т,78т,110/а, Подшивка № 1007 сент. (127-143), Подшивка № 1035 янв. (1-14), Подшивка № 1058 февр. (15-29), Подшивка № 1059 июнь (78-93), Подшивка № 1060 июль (93П-110), Подшивка № 1061 нояб. (162-177), Подшивка № 1062 окт. (143П-161), Подшивка № 1063 авг.-сент. (110/а-126), Подшивка № 1064 дек. (178-194), Подшивка № 1099 март (30-46), Подшивка № 1100 апр. (46П-62П), Подшивка № 1101 май (63-77)"));
            result.Fields.Add(Parse(909, "^Q2006^H1-29,31,33-38,40-133,135-189,192-194,196,3/т,7/т,15/т,26/т,30/т,49/т,53/т,53/т,57/т,61/т,64/т,67/т,71/т,75/т,79/т,83/т,86/т,90/т,94/т,98/т,102/т,105/т,109/т,113/т,117/т,120/т,124/т,128/т,132/т,136/т,137/т,140/т,144/т,148/т,152/т,156/т,160/т,164/т,167/т,171/т,175/т,179/т,183/т,187/т,190/т,191/т,195/т,152/,Спецвып. \"Наш Байкал\", Подшивка № 566 февр.-март (14-45), Подшивка № 567 май (63-78), Подшивка № 568 апр. (46-62), Подшивка № 569 июнь (79-94), Подшивка № 570 сент.-окт. (128-144), Подшивка № 571 сент.-окт. (145-162), Подшивка № 572 дек. (179-196), Подшивка № 603 янв. (1-13), Подшивка № 604 июль (95-110), Подшивка № 605 нояб.-дек. (163-179/т), Подшивка № 658 авг.-сент. (111-128/т)"));
            result.Fields.Add(Parse(909, "^Q2005^H1-5,7-12,14,15,17-68,70,71,73,74,76-89,91-98,103-105,107-121,123-128,130-132,134-136,138-164,167-174,176-187,189,191,193-199,201-203,Спец.прил. №2,38/т,41/т,45/т,49/т,53/т,57/т,61/т,65/т,69/т,72/т,75/т,106/т,110/Т,118/Т,122/Т,126/т,129/т,133/т,137/т,145/т,149/т,153/т,157/т,161/т,165/т,169/т,173/т,175/т,179/т,183/т,191/т,195/т,199/т,203/т,Спец.прил.№18,Подшивка № 105 январь.,Подшивка № 117 авг. (120-136), Подшивка № 112 июль (102-115, Подшивка № 108 март(17-35), Подшивка № 107 апрель (54-70), Подшивка № 106 март.(36-53), Подшивка № 113 дек. (186-203), Подшивка № 114 нояб. (171-185), Подшивка № 115 май. (71-85), Подшивка № 116 сент. (137-153), Подшивка № 118 окт. (153-170), Подшивка № 119 июнь. (86-102)"));
            result.Fields.Add(Parse(909, "^Q2004^H1,4-50,52-151,153-219,222-247,2/3,[141],[148],[149],Спец. прил. №12,Спец.вып.2,Спец.прил. №21"));
            result.Fields.Add(Parse(909, "^Q2004^DКПИО^H220-247,Спец.прил. №21^k1"));
            result.Fields.Add(Parse(905, "^J1^S1^21^D1^OB^I1^T1^F2"));

            return result;
        }

        [TestMethod]
        public void MagazineCumulation_Construction_1()
        {
            var cumulation = new MagazineCumulation();
            Assert.IsNull(cumulation.Year);
            Assert.IsNull(cumulation.Volume);
            Assert.IsNull(cumulation.Place);
            Assert.IsNull(cumulation.Numbers);
            Assert.IsNull(cumulation.ComplectNumber);
            Assert.IsNull(cumulation.UnknownSubFields);
            Assert.IsNull(cumulation.UserData);
        }

        [TestMethod]
        public void MagazineCumulation_Parse_1()
        {
            var field = _GetField();
            var cumulation = MagazineCumulation.ParseField(field);
            Assert.AreEqual(field.GetFirstSubFieldValue('q'), cumulation.Year);
            Assert.AreEqual(field.GetFirstSubFieldValue('f'), cumulation.Volume);
            Assert.AreEqual(field.GetFirstSubFieldValue('d'), cumulation.Place);
            Assert.AreEqual(field.GetFirstSubFieldValue('h'), cumulation.Numbers);
            Assert.AreEqual(field.GetFirstSubFieldValue('k'), cumulation.ComplectNumber);
            Assert.IsNotNull(cumulation.UnknownSubFields);
            Assert.AreEqual(0, cumulation.UnknownSubFields!.Length);
        }

        [TestMethod]
        public void MagazineCumulation_Parse_2()
        {
            var record = _GetRecord();
            var cumulations = MagazineCumulation.ParseRecord(record);
            Assert.AreEqual(42, cumulations.Length);
        }

        [TestMethod]
        public void MagazineCumulation_ApplyToField_1()
        {
            var field = new Field { Tag = MagazineCumulation.Tag }
                .Add('q', "2222")
                .Add('h', "1,2,3");
            var cumulation = _GetCumulation();
            cumulation.ApplyTo(field);
            Assert.AreEqual(cumulation.Year, field.GetFirstSubFieldValue('q'));
            Assert.AreEqual(cumulation.Numbers, field.GetFirstSubFieldValue('h'));
        }

        [TestMethod]
        public void MagazineCumulation_ToField_1()
        {
            var cumulation = _GetCumulation();
            var field = cumulation.ToField();
            Assert.AreEqual(cumulation.Year, field.GetFirstSubFieldValue('q'));
            Assert.AreEqual(cumulation.Volume, field.GetFirstSubFieldValue('f'));
            Assert.AreEqual(cumulation.Place, field.GetFirstSubFieldValue('d'));
            Assert.AreEqual(cumulation.Numbers, field.GetFirstSubFieldValue('h'));
            Assert.AreEqual(cumulation.ComplectNumber, field.GetFirstSubFieldValue('k'));
        }

        private void _TestSerialization
            (
                MagazineCumulation first
            )
        {
            var bytes = first.SaveToMemory();
            var second = bytes.RestoreObjectFromMemory<MagazineCumulation>();
            Assert.IsNotNull(second);
            Assert.AreEqual(first.Year, second!.Year);
            Assert.AreEqual(first.Volume, second.Volume);
            Assert.AreEqual(first.Place, second.Place);
            Assert.AreEqual(first.Numbers, second.Numbers);
            Assert.AreEqual(first.ComplectNumber, second.ComplectNumber);
            if (first.UnknownSubFields is null)
            {
                Assert.IsNull(second.UnknownSubFields);
            }
            else
            {
                Assert.IsNotNull(second.UnknownSubFields);
                Assert.AreEqual(first.UnknownSubFields.Length, second.UnknownSubFields!.Length);
                for (var i = 0; i < first.UnknownSubFields.Length; i++)
                {
                    Assert.AreEqual(first.UnknownSubFields[i].Code, second.UnknownSubFields[i].Code);
                    Assert.AreEqual(first.UnknownSubFields[i].Value, second.UnknownSubFields[i].Value);
                }
            }

            Assert.IsNull(second.UserData);
        }

        [TestMethod]
        public void MagazineCumulation_Serialization_1()
        {
            var cumulation = new MagazineCumulation();
            _TestSerialization(cumulation);

            cumulation = _GetCumulation();
            cumulation.UserData = "User data";
            _TestSerialization(cumulation);
        }

        [TestMethod]
        public void MagazineCumulation_ToXml_1()
        {
            var cumulation = new MagazineCumulation();
            Assert.AreEqual("<cumulation />", XmlUtility.SerializeShort(cumulation));

            cumulation = _GetCumulation();
            Assert.AreEqual("<cumulation year=\"2016\" place=\"Ф403\" numbers=\"1,3,4,6,7,9,10,12,13,15,16,18,20,21,23,25,26,28,29,31,32,34,35,37,38,40,41,43,44,46,48,49,51,52,54,55,57,58,60,61,64,66,67,69,70,72,73,75,76,78,79,81,82,84,85,87,88,90,91,93,94,96,97,99,100,102,103,105,106,108,109,111,114,115,2/ч,5/ч,8/ч,11/ч,14/ч,17/ч,19/ч,22/ч,24/ч,27/ч,30/ч,33/ч,36/ч,39/ч,42/ч,45/ч,47/ч,50/ч,53/ч,56/ч,59/ч,62/ч,65/ч,68/ч,71/ч,74/ч,77/ч,80/ч,83/ч,86/ч,89/ч,92/ч,95/ч,98/ч,101/ч,104/ч,107/ч,4/п,7/п,10/п,13/п,16/п,21/п,26/п,29/п,32/п,35/п,38/п,41/п,44/п,52/п,55/п,58/п,61/п,67/п,70/п,72/п,73/п,79/п,82/п,85/п,88/п,91/п,94/п,97/п,100/п,103/п,106/п,109/п,63/д,110/ч,112/п,113/ч,115/п,117,118,120,121,123,124,116/ч,118/п,119/ч,121/п,122/ч,124/п,126,128,129,131,127/ч,129/п,130/ч,132/п,132,134,135,137,138,135/п,138/п,133/ч,136/ч,139/ч,140,141/п,141,142/ч,145/ч,143,144/п,144,146,147,147/п,148/ч,149,125/ч-126,1/т-52/т\" set=\"1\" />", XmlUtility.SerializeShort(cumulation));
        }

        [TestMethod]
        public void MagazineCumulation_ToJson_1()
        {
            var cumulation = new MagazineCumulation();
            Assert.AreEqual("{}", JsonUtility.SerializeShort(cumulation));

            cumulation = _GetCumulation();
            Assert.AreEqual("{\"year\":\"2016\",\"place\":\"\\u0424403\",\"numbers\":\"1,3,4,6,7,9,10,12,13,15,16,18,20,21,23,25,26,28,29,31,32,34,35,37,38,40,41,43,44,46,48,49,51,52,54,55,57,58,60,61,64,66,67,69,70,72,73,75,76,78,79,81,82,84,85,87,88,90,91,93,94,96,97,99,100,102,103,105,106,108,109,111,114,115,2/\\u0447,5/\\u0447,8/\\u0447,11/\\u0447,14/\\u0447,17/\\u0447,19/\\u0447,22/\\u0447,24/\\u0447,27/\\u0447,30/\\u0447,33/\\u0447,36/\\u0447,39/\\u0447,42/\\u0447,45/\\u0447,47/\\u0447,50/\\u0447,53/\\u0447,56/\\u0447,59/\\u0447,62/\\u0447,65/\\u0447,68/\\u0447,71/\\u0447,74/\\u0447,77/\\u0447,80/\\u0447,83/\\u0447,86/\\u0447,89/\\u0447,92/\\u0447,95/\\u0447,98/\\u0447,101/\\u0447,104/\\u0447,107/\\u0447,4/\\u043F,7/\\u043F,10/\\u043F,13/\\u043F,16/\\u043F,21/\\u043F,26/\\u043F,29/\\u043F,32/\\u043F,35/\\u043F,38/\\u043F,41/\\u043F,44/\\u043F,52/\\u043F,55/\\u043F,58/\\u043F,61/\\u043F,67/\\u043F,70/\\u043F,72/\\u043F,73/\\u043F,79/\\u043F,82/\\u043F,85/\\u043F,88/\\u043F,91/\\u043F,94/\\u043F,97/\\u043F,100/\\u043F,103/\\u043F,106/\\u043F,109/\\u043F,63/\\u0434,110/\\u0447,112/\\u043F,113/\\u0447,115/\\u043F,117,118,120,121,123,124,116/\\u0447,118/\\u043F,119/\\u0447,121/\\u043F,122/\\u0447,124/\\u043F,126,128,129,131,127/\\u0447,129/\\u043F,130/\\u0447,132/\\u043F,132,134,135,137,138,135/\\u043F,138/\\u043F,133/\\u0447,136/\\u0447,139/\\u0447,140,141/\\u043F,141,142/\\u0447,145/\\u0447,143,144/\\u043F,144,146,147,147/\\u043F,148/\\u0447,149,125/\\u0447-126,1/\\u0442-52/\\u0442\",\"set\":\"1\"}", JsonUtility.SerializeShort(cumulation));
        }

        [TestMethod]
        public void MagzineCumulation_Verify_1()
        {
            var cumulation = new MagazineCumulation();
            Assert.IsFalse(cumulation.Verify(false));

            cumulation = _GetCumulation();
            Assert.IsTrue(cumulation.Verify(false));
        }

        [TestMethod]
        public void MagazineCumulation_ToString_1()
        {
            var cumulation = new MagazineCumulation();
            Assert.AreEqual(string.Empty, cumulation.ToString());

            cumulation = _GetCumulation();
            Assert.AreEqual("2016 | Ф403 | 1 | 1,3,4,6,7,9,10,12,13,15,16,18,20,21,23,25,26,28,29,31,32,34,35,37,38,40,41,43,44,46,48,49,51,52,54,55,57,58,60,61,64,66,67,69,70,72,73,75,76,78,79,81,82,84,85,87,88,90,91,93,94,96,97,99,100,102,103,105,106,108,109,111,114,115,2/ч,5/ч,8/ч,11/ч,14/ч,17/ч,19/ч,22/ч,24/ч,27/ч,30/ч,33/ч,36/ч,39/ч,42/ч,45/ч,47/ч,50/ч,53/ч,56/ч,59/ч,62/ч,65/ч,68/ч,71/ч,74/ч,77/ч,80/ч,83/ч,86/ч,89/ч,92/ч,95/ч,98/ч,101/ч,104/ч,107/ч,4/п,7/п,10/п,13/п,16/п,21/п,26/п,29/п,32/п,35/п,38/п,41/п,44/п,52/п,55/п,58/п,61/п,67/п,70/п,72/п,73/п,79/п,82/п,85/п,88/п,91/п,94/п,97/п,100/п,103/п,106/п,109/п,63/д,110/ч,112/п,113/ч,115/п,117,118,120,121,123,124,116/ч,118/п,119/ч,121/п,122/ч,124/п,126,128,129,131,127/ч,129/п,130/ч,132/п,132,134,135,137,138,135/п,138/п,133/ч,136/ч,139/ч,140,141/п,141,142/ч,145/ч,143,144/п,144,146,147,147/п,148/ч,149,125/ч-126,1/т-52/т", cumulation.ToString());
        }
    }
}
